package cm.unit2.theme4;
import static java.lang.Math.max;

public class CutRope {

	public static int cache[] = null; 
	
	public int cutRope(int n) {
		if (n<2) {
			return 0;
		}
		if (n==2) {
			return 1;
		}
		if (n==3) {
			return 2;
		}else {
			cache = new int[61];
			cache[2] = 2;
			cache[3] = 3;
			return cutRope02(n);
		}
		
	}

	// 暴力搜索
	public int cutRope01(int n){
		if (cache[n]!=0) {
			return cache[n];
		}
		int maxLen = 0;
		for (int i = 1; i < n; i++) {
			maxLen = max(i*cutRope01(n-i),maxLen);
		}
		return maxLen;
    }
	
	// 记忆化递归
	public int cutRope02(int n){
		if (cache[n]!=0) {
			return cache[n];
		}
		int maxLen = 0;
		for (int i = 1; i < n; i++) {
			maxLen = max(i*cutRope02(n-i),maxLen);
		}
		cache[n] = maxLen;
		return maxLen;
    }
	
	// 动态规划
	public int cutRope03(int n) {
       // n<=3的情况，m>1必须要分段，例如：3必须分成1、2；1、1、1 ，n=3最大分段乘积是2,
		if (n<2) {
			return 0;
		}
		if (n==2) {
			return 1;
		}
		if (n==3) {
			return 2;
		}
		
        int[] dp = new int[n+1];
        /*
         * 	下面3行是n>=4的情况，跟n<=3不同，4可以分很多段，比如分成1、3，
         * 	这里的3可以不需要再分了，因为3分段最大才2，不分就是3。记录最大的。
         */
        dp[1]=1;
        dp[2]=2;
        dp[3]=3;
        int res=0;//记录最大的
        for (int i = 4; i <= n; i++) {
            for (int j = 1; j <=i/2 ; j++) {
                res=Math.max(res,dp[j]*dp[i-j]);
            }
            dp[i]=res;
        }
        return dp[n];
    }
	
	// 贪心法
	public int cutRope04(int n) {
       // n<=3的情况，m>1必须要分段，例如：3必须分成1、2；1、1、1 ，n=3最大分段乘积是2,
		if (n<2) {
			return 0;
		}
		if (n==2) {
			return 1;
		}
		if (n==3) {
			return 2;
		}
		return 0;
    }
	
	public static void main(String[] args) {
		CutRope cutRope = new CutRope();
		for (int i = 2; i <= 30; i++) {
			System.out.print("i="+i);
			System.out.print(",Re->"+cutRope.cutRope(i));
			System.out.println(",dp->"+cutRope.cutRope03(i));
		}
	}
}
